Javaでローカルの変数名を取得する
概要
Javaのプログラム中、
String a = なにやら;
log(a.name()+"="+a);
と書いて、
関数logから出力されるのが、
a:なにやら
とかなると、後から追うときちょっと楽かなと思った。
具体的には、記述として
String val1 = "val1Value";
String val2 = "val2Value";
System.out.println("val1="+ val1+"val2"+ val2);
ってのが
String val1 = "val1Value";
String val2 = "val2Value";
System.out.println(val1.name()+"="+ val1+val2.name()+"="+ val2);
になる。
特にリファクタリングが楽そう。
もちろんStringクラスにフィールド名吐くnameメソッドなど無い。
(C#だとnameプロパティ有るけどねwww って教えてくれたobhrありがとう。ムカつく。)
方法's
コンパイラにオプション渡してそれっぽい情報がclassに乗るようにする+リフレクション
@tan_go238さん、@backpaper0 さん、@kimukou2628さん、@kurobaraさん、より
backpaper0 @tan_go238 @toru_inoue -gか-g:varsつけてjavacしないとローカル変数名や引数名って消えちゃう気が。フィールド名は普通に取れるけど。12/06/17 17:31
|
Javassistを使う
@masanobuimai さんより
|
masanobuimai @toru_inoue javassist使うとできるみたいですよ。http://t.co/lt4GcxGx |
Paranamerを使う
@esmasui さんより。
|
esmasui @toru_inoue paranamer使うといいと思いますの |
これか。
http://paranamer.codehaus.org/
使用例は
http://d.hatena.ne.jp/Kazzz/20100222/p1
感想:Twitterすごい。
今回は用途が[できなくてはいけない]というレベルではないため、さすがにJavasstとかは
つかえないが、、
勉強になった。
で、
ここからうらがみさん無双
|
backpaper0 @tan_go238 @toru_inoue やっとできたhttps://t.co/VOT8i5og |
ふえー。できるもんなんだ、、 うらがみさんすげー、、!
手元で確認した範囲だと、
attr.getConstPool().getUtf8Info(attr.nameIndex(1));
はnameIndex(0)でthis, 1でaを返してくる。
言語仕様的に、採番は定義順っぽいんだけど(自分が、それ以外の方法でJVMが値マッピングの方法をとっている、という部分を見つけられなかったため確証は無い)
どうしても心配なら、順は保証されてないことにして、値の集合として扱えばいいと思う。
そういうふうにClassから切れば、つかえる。
1宣言のために1クラスだととっても効率悪いけど、1集合とかなら行けそう。
突然の話題に返答ありがとう!
重ねてお礼申し上げます。
神様、見てたらうらがみさんに日曜日をもう一日。